/**
 * @param {character[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
/* 
为了将被 'X' 围绕的 'O' 区域转换为 'X'，可以利用边界上的 'O' 作为起点，
通过深度优先搜索（DFS）或广度优先搜索（BFS）标记所有与边界相连的 'O'，这些区域不会被转换。最后，将未被标记的 'O' 转换为 'X'。

方法思路
标记边界区域：遍历矩阵的四条边界，对边界上的每个 'O' 进行 DFS 或 BFS，将所有可达的 'O' 标记为临时字符（如 '#'）。
转换未标记区域：遍历整个矩阵，将所有未被标记的 'O'（即仍为 'O' 的字符）转换为 'X'，将所有标记为 '#' 的字符恢复为 'O'。
*/
var solve = function (board) {
  const m = board.length;
  if (m === 0) return;
  const n = board[0].length;

  // 方向数组：上、下、左、右
  const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];

  // 标记与边界相连的 'O'
  const markBorder = (i, j) => {
    if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] !== 'O') {
      return;
    }
    board[i][j] = '#'; // 标记为临时字符
    // 递归标记四个方向的相邻单元格
    for (const [di, dj] of directions) {
      markBorder(i + di, j + dj);
    }
  };

  // 遍历四条边界
  for (let j = 0; j < n; j++) {
    if (board[0][j] === 'O') markBorder(0, j); // 上边界
    if (board[m - 1][j] === 'O') markBorder(m - 1, j); // 下边界
  }
  for (let i = 0; i < m; i++) {
    if (board[i][0] === 'O') markBorder(i, 0); // 左边界
    if (board[i][n - 1] === 'O') markBorder(i, n - 1); // 右边界
  }

  // 转换未标记的 'O' 并恢复标记的 '#'
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (board[i][j] === 'O') {
        board[i][j] = 'X'; // 未标记的 'O' 转换为 'X'
      } else if (board[i][j] === '#') {
        board[i][j] = 'O'; // 恢复标记的 '#' 为 'O'
      }
    }
  }
};